package com.aaa.service.impl;

import cn.hutool.db.Entity;
import com.aaa.dao.UserDao;
import com.aaa.dao.impl.UserDaoImpl;
import com.aaa.service.UserService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 用户服务接口的实现类，提供关于用户管理的具体业务逻辑实现。
 *
 * @author Teacher陈
 * @date 2024/7/16 14:26
 * @version 1.0
 */
public class UserServiceImpl implements UserService {
    // 初始化UserDao对象，用于执行与用户相关的数据库操作
    UserDao userDao = new UserDaoImpl();

    /**
     * 添加用户信息到数据库。
     *
     * @param map 包含用户信息的Map对象，键值对表示字段名和对应的值。
     * @return boolean 表示操作是否成功。
     */
    @Override
    public boolean addUser(Map map) {

         //获取明文密码
        String password = (String) map.get("password");
        //明文密码的加密
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encode = passwordEncoder.encode(password);
        //操作数据库之前，将明文密码更换成密码文
        map.put("password",encode);
        //创建时间
        map.put("created_time",new Date());
        return userDao.addUser(map);
    }

    /**
     * 根据条件删除用户信息。
     *
     * @param map 包含删除条件的Map对象，键值对表示字段名和对应的值。
     * @return boolean 表示操作是否成功。
     */
    @Override
    public boolean deleteUser(Map map) {
        /**
         * 步骤一：im_user 中的数据更新  type=3
         * 步骤二：删除im_friend 中的朋友关系  双向关系
         * 步骤三：im_group 更新拥有者，如果群里只有当前一个人，则删除该群
         * 步骤四：im_group_member 更新用户信息退出信息（quit）
         */
        userDao.updateUserTypeById(map);
        userDao.deleteFriendById(map);
        return userDao.updateOwnerId(map);
    }

    /**
     * 根据条件更新用户信息。
     *
     * @param map 包含更新条件和新用户信息的Map对象，键值对表示字段名和对应的值。
     * @return boolean 表示操作是否成功。
     */
    @Override
    public boolean updateUser(Map map) {
        //对密码进行特殊处理，如果传入的密码和数据库密码一致，则不更新，否则加密更新
        Entity userById = this.findUserById(map);
        if(!userById.get("password").equals(map.get("password"))){
            String password = (String) map.get("password");
            PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
            String encode = passwordEncoder.encode(password);
            map.put("password",encode);
        }
        return userDao.updateUser(map);
    }

    /**
     * 查询所有用户信息。
     *
     * @return List<Entity> 包含所有用户信息的列表，每个用户信息为一个Entity对象。
     */
    @Override
    public List<Entity> findUser() {
        return userDao.findUser();
    }

    /**
     * 根据用户ID查询用户信息。
     *
     * @param map 包含用户ID的Map对象，键值对表示字段名和对应的值。
     * @return Entity 包含指定用户信息的Entity对象。
     */
    @Override
    public Entity findUserById(Map map) {
        return userDao.findUserById(map);
    }

    @Override
    public Entity findUserByName(String user_name) {
        return userDao.findUserByName(user_name);
    }

    @Override
    public boolean updateUserLoginTime(Map map) {
        return  userDao.updateUserLoginTime(map);
    }

    @Override
    public Entity findUserByNameCheck(String user_name) {
        return  userDao.findUserByNameCheck(user_name);
    }
}
